package top.malaoshi.jdbc;

import top.malaoshi.jdbc.annotation.Result;

import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

public class IntrospectorUtils {

    /**
     * 获取setter方法
     * @param clazz
     * @return 返回Map，属性名、Result注解的column作为key，setter方法作为value
     */
    public static Map<String, Method> getSetMethods(Class clazz) throws IntrospectionException, NoSuchFieldException {
        // 使用内省，目的：是反射的简化写法
        BeanInfo bi= Introspector.getBeanInfo(clazz); // 返回 BeanInfo，bean的信息
        // 将信息取出，放入到数组里
        PropertyDescriptor[] pds=bi.getPropertyDescriptors();
        // 将属性 和 相关的set方法，放入到map中
        Map<String,Method> propertyAndSetterMap = new HashMap();
        for( PropertyDescriptor pd : pds){
            String propertyName = pd.getName();
            if("class".equals(propertyName)){
                continue;
            }
            // 取出该属性对应Field类
            Field field = clazz.getDeclaredField(propertyName);
            // 取出该属性的 Result 注解
            Result resultAnn = field.getAnnotation(Result.class);
            String columnName = propertyName;
            if(resultAnn!=null){
                columnName = resultAnn.column();
            }
            // 获取 set方法 的信息
            Method method = pd.getWriteMethod();
            // 如果有 set 方法，就放入到map中
            if(method!=null) {
                propertyAndSetterMap.put(columnName,method);
            }
        }
        return propertyAndSetterMap;
    }

}
